package com.java.yz.day16;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

//通过反射获取构造方法并使用
/*
    获取构造方法
		getConstructors
		getDeclaredConstructors

 */
public class ReflexDemo2 {
    public static void main(String[] args) throws Exception{
            //先创建Class对象
            Class<?> studentClass = Class.forName("com.java.yz.day16.Student");

            //获取所有的被public构造方法
//            Constructor<?>[] constructors = studentClass.getConstructors();
//            for (Constructor<?> constructor : constructors) {
//                System.out.println(constructor);
//                //public com.java.yz.day16.Student(int)
//                //public com.java.yz.day16.Student()
//            }

            //获取所有的构造方法（包括private修饰的）getDeclaredConstructors
//            Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
//            for (Constructor<?> declaredConstructor : declaredConstructors) {
//                System.out.println(declaredConstructor);
//            }

            //获取单个的构造方法
//            Constructor<?> constructor = studentClass.getConstructor();
//            System.out.println(constructor);
            //public com.java.yz.day16.Student() 默认获取的是无参公共的构造方法

//            Constructor<?> constructor = studentClass.getConstructor(int.class);
//            System.out.println(constructor);
            //public com.java.yz.day16.Student(int) 调用的是有参的公共方法

            //获取私有的构造方法
            Constructor<?> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
            System.out.println(declaredConstructor);
            //private com.java.yz.day16.Student(java.lang.String)

            //能够获取到构造方法，用构造方法来创建对象
            //创建对象  newInstance()
            //T newInstance(object... initangs)
            //使用此Constructor对象表示的构造函数，使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
        //绕过检测，暴力访问
            declaredConstructor.setAccessible(true);
            Object o = declaredConstructor.newInstance("杨镇");


            System.out.println(o);

    }
}
